package com.zch.util.str;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * The type Chinese util.
 *
 * @author zchcpywin10
 */
public class ChineseUtil {
  private ChineseUtil() {
  }
  public static final Pattern PATTERN = Pattern.compile("[\u4e00-\u9fa5]");
  /**
   * 判断字符串中是否包含中文
   *
   * @param str 待校验字符串
   * @return 是否为中文 boolean
   * @ warn 不能校验是否为中文标点符号
   */
  public static boolean isContainChinese(String str) {
    Matcher m = PATTERN.matcher(str);
    return m.find();
  }
  /**
   * 过滤掉中文
   *
   * @param str 待过滤中文的字符串
   * @return 过滤掉中文后字符串 string
   */
  public static String filterToReplaceChinese(String str) {
    // 用于返回结果
    String result = str;
    boolean flag = isContainChinese(str);
    // 包含中文
    if (flag) {
      // 用于拼接过滤中文后的字符 // StringBuffer sb = new StringBuffer()
      StringBuilder sb = new StringBuilder();
      // 用于校验是否为中文
      boolean flag2 = false;
      // 用于临时存储单字符
      char chinese = 0;
      // 5.去除掉文件名中的中文
      // 将字符串转换成char[]
      char[] charArray = str.toCharArray();
      // 过滤到中文及中文字符
      for (char c : charArray) {
        chinese = c;
        flag2 = isChinese(chinese);
        // 不是中日韩文字及标点符号
        if (!flag2) {
          sb.append(chinese);
        }
      }
      result = sb.toString();
    }
    return result;
  }
  /**
   * 验证字符串内容是否包含下列非法字符<br>
   * `~!#%^&*=+\\|{};:'\",<>/?○●★☆☉♀♂※¤╬の〆
   *
   * @param content 字符串内容
   * @return 't'代表不包含非法字符，otherwise代表包含非法字符。
   */
  public static char validateLegalString(String content) {
    String illegal = "`~!#%^&*=+\\|{};:'\",<>/?○●★☆☉♀♂※¤╬の〆";
    char isLegalChar = 't';
    // L1:
    for (int i = 0; i < content.length(); i++) {
      for (int j = 0; j < illegal.length(); j++) {
        if (content.charAt(i) == illegal.charAt(j)) {
          isLegalChar = content.charAt(i);
          // break L1
          break;
        }
      }
    }
    return isLegalChar;
  }
  /**
   * 验证是否是汉字或者0-9、a-z、A-Z
   *
   * @param c 被验证的char
   * @return true代表符合条件 boolean
   */
  public static boolean isRightChar(char c) {
    return isChinese(c) || isWord(c);
  }
  /**
   * 校验某个字符是否是a-z、A-Z、_、0-9
   *
   * @param c 被校验的字符
   * @return true代表符合条件 boolean
   */
  public static boolean isWord(char c) {
    String regEx = "[\\w]";
    Pattern p = Pattern.compile(regEx);
    Matcher m = p.matcher("" + c);
    return m.matches();
  }
  /**
   * 判定输入的是否是汉字
   *
   * @param needCheckChar 被校验的字符
   * @return true代表是汉字 boolean
   */
  public static boolean isChinese(char needCheckChar) {
    Character.UnicodeBlock ub = Character.UnicodeBlock.of(needCheckChar);
    boolean a = (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS);
    boolean b = (ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS);
    boolean c = (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A);
    boolean d = (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION);
    boolean e = (ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION);
    boolean f = (ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS);
    return (a || b || c || d || e || f);
  }
  /**
   * 校验一个字符是否是汉字
   *
   * @param c 被校验的字符
   * @return true代表是汉字 boolean
   */
  public static boolean isChineseChar(char c) {
    try {
      return String.valueOf(c).getBytes(StandardCharsets.UTF_8).length > 1;
    }
    catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }
  /**
   * 校验String是否全是中文
   *
   * @param name 被校验的字符串
   * @return true代表全是汉字 boolean
   */
  public static boolean checkNameIsAllChinese(String name) {
    boolean res = true;
    char[] cTemp = name.toCharArray();
    for (int i = 0; i < name.length(); i++) {
      if (!isChinese(cTemp[i])) {
        res = false;
        break;
      }
    }
    return res;
  }
}
